use std::env;
use std::str::FromStr; // 将str解析为数字的trait // 读取命令行参数的API

// 本程序不可以直接运行，请使用类似：
// cargo run 5 55 555 5555
// 的命令，带参数运行

fn main() {
    let mut numbers = Vec::new(); // 存放参数的列表

    // 遍历参数列表，但跳过第一个参数
    for arg in env::args().skip(1) {
        numbers.push(u64::from_str(&arg).expect("错误的命令行参数!"));
    }

    if numbers.len() == 0 {
        eprintln!("命令行参数个数不正确!(少于两个)");
        std::process::exit(1); // main返回1
    }

    // 取第一个数字为基准，后面的数字挨个和它求取公约数
    let mut d = numbers[0];
    for m in &numbers[1..] {
        d = gcd(d, *m);
    }

    // 最后打印结果
    println!("以下数据: {:?} 的最大公约数是: {}", numbers, d)

}

fn gcd(mut n: u64, mut m: u64) -> u64 {
    assert!(n != 0 && m != 0);
    while m != 0 {
        if m < n {
            let t = m;
            m = n;
            n = t;
        }
        m = m % n;
    }
    n
}
